import type {
  AxiosRequestConfig,
  AxiosResponse,
  ApiRequestConfig,
  ApiResponseSuccess,
} from 'axios';
import { apiRequestConfigToAxiosRequestConfig } from './helper/requestConfig';
import { createAxiosInstance } from './createAxiosInstance';

const instance = createAxiosInstance({
  /**
   * 本地开发时，在所有请求前增加 /api，以便在vite.config 中设置代理
   * 版本前缀全部在接口函数定义时设置，即 url: 'v7/xxx'
   */
  baseURL: import.meta.env.PROD ? import.meta.env.VITE_BASE_API : '/api',
  timeout: 30 * 1000,
});

/**
 * 使用 axios 实例发送请求
 * @template {AxiosResponse['data']} D
 * @template {AxiosRequestConfig['data']} C
 */
async function axiosRequest<D, C = any>(config: AxiosRequestConfig<C>) {
  try {
    return await instance.request<D, AxiosResponse<D, C>, C>(config);
  } catch (e) {
    return Promise.reject(e);
  }
}

/**
 * api 请求入口
 * @description 使用 axios 实例发送请求前做一些准备工作
 * @template {AxiosResponse<ApiResponseSuccess>['data']} D
 * @template {AxiosRequestConfig['data']} C
 * @param config api 请求配置
 */
async function apiRequest<D, C = any>(config: ApiRequestConfig<C>): Promise<ApiResponseSuccess<D>> {
  try {
    // 转换接口参数
    const axiosRequestConfig = apiRequestConfigToAxiosRequestConfig(config);

    const res = await axiosRequest<ApiResponseSuccess<D>, C>(axiosRequestConfig);

    return res.data;
  } catch (err) {
    return Promise.reject(err);
  }
}

export { axiosRequest, apiRequest };
